#ifndef _WIFI_H_
#define _WIFI_H_

// 获取文件类型
String getContentType(String filename)
{
  if (filename.endsWith(".htm"))
    return "text/html";
  else if (filename.endsWith(".html"))
    return "text/html";
  else if (filename.endsWith(".css"))
    return "text/css";
  else if (filename.endsWith(".js"))
    return "application/javascript";
  else if (filename.endsWith(".png"))
    return "image/png";
  else if (filename.endsWith(".gif"))
    return "image/gif";
  else if (filename.endsWith(".jpg"))
    return "image/jpeg";
  else if (filename.endsWith(".ico"))
    return "image/x-icon";
  else if (filename.endsWith(".xml"))
    return "text/xml";
  else if (filename.endsWith(".pdf"))
    return "application/x-pdf";
  else if (filename.endsWith(".zip"))
    return "application/x-zip";
  else if (filename.endsWith(".gz"))
    return "application/x-gzip";
  return "text/plain";
}

bool handleFileRead(String resource)
{ // 处理浏览器HTTP访问
  if (resource.endsWith("/"))
  {                            // 如果访问地址以"/"为结尾
    resource = "/normal.html"; // 则将访问地址修改为/index.html便于SPIFFS访问
  }
  String contentType = getContentType(resource); // 获取文件类型

  if (SPIFFS.exists(resource))
  {                                               // 如果访问的文件可以在SPIFFS中找到
    File file = SPIFFS.open(resource, "r");       // 则尝试打开该文件
    esp8266_server.streamFile(file, contentType); // 并且将该文件返回给浏览器
    file.close();                                 // 并且关闭文件
    return true;
  } // 返回true

  return false; // 如果文件未找到，则返回false
}

void handleUserRequest()
{

  // 获取用户请求资源(Request Resource）
  String reqResource = esp8266_server.uri();
  Serial.print("reqResource: ");
  Serial.println(reqResource);

  // 通过handleFileRead函数处处理用户请求资源
  bool fileReadOK = handleFileRead(reqResource);

  // 如果在SPIFFS无法找到用户访问的资源，则打开normal.html
  if (!fileReadOK)
  {
    // esp8266_server.send(404, "text/plain", "404 Not Found");//回复404 (Not Found)
    reqResource = "/normal.html";
    handleFileRead(reqResource);
  }
}

void initWeb()
{
  WiFi.begin(ssid, pswd);         // 启动网络连接
  Serial.print("Connecting to "); // 串口监视器输出网络连接信息
  Serial.print(ssid);
  Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接

  int i = 0; // 这一段程序语句用于检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED)
  {             // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。
    delay(500); // 如果WiFi连接成功则返回值为WL_CONNECTED
    i++;
    Serial.print('.'); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
    if (i >= 10)
      break;
  }
  if (WiFi.status() == WL_CONNECTED)
  {
    Serial.println("");                        // WiFi连接成功后
    Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。
    Serial.print("IP address:    ");           // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
    Serial.println(WiFi.localIP());            // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
  }
  else
  {
    Serial.println("");                   // WiFi连接成功后
    Serial.println("Connection falsed!"); // NodeMCU将通过串口监视器输出"连接成功"信息。
  }

  // 初始化网络服务器

  // esp8266_server.on("/Yard", Handle_ya);
  esp8266_server.onNotFound(handleUserRequest); // 处理其它网络请求

  // 启动网站服务
  esp8266_server.begin();
  Serial.println("HTTP server started");
}

// 发送HTTP请求并且将服务器响应通过串口输出
bool httpClientRequest(uint8_t position)
{ // 1 livingroom
  // 2 bedroom
  // 3 yard

  // 重点1 创建 HTTPClient 对象
  HTTPClient httpClient;

  // 重点2 通过begin函数配置请求地址。此处也可以不使用端口号和PATH而单纯的
  String URL;
  uint8_t rec;
  switch (position)
  {
  case 1:
    URL = URL_living;
    break;
  case 2:
    URL = URL_bed;
    break;
  case 3:
    URL = URL_yard;
    break;
  }
  httpClient.begin(wifiClient, URL);
  Serial.print("URL: ");
  Serial.println(URL);

  // 重点3 通过GET函数启动连接并发送HTTP请求
  int httpCode = httpClient.GET();
  Serial.print("Send GET request to URL: ");
  Serial.println(URL);

  // 重点4. 如果服务器响应HTTP_CODE_OK(200)则从服务器获取响应体信息并通过串口输出
  // 如果服务器不响应HTTP_CODE_OK(200)则将服务器响应状态码通过串口输出
  if (httpCode == HTTP_CODE_OK)
  {

    // 使用getString函数获取服务器响应体内容
    String responsePayload = httpClient.getString();
    rec = responsePayload.toInt();
    Serial.println("Server Response Payload: ");
    Serial.println(responsePayload);
    Serial.print("rec = ");
    Serial.println(rec);
  }
  else
  {
    Serial.println("Server Respose Code：");
    Serial.println(httpCode);
  }

  // 重点5. 关闭ESP8266与服务器连接
  httpClient.end();
  return rec;
}

#endif
